package br.ucb.cesbdao.utilBeans;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;

import javax.swing.JList;
import javax.swing.JTable;

import br.ucb.cesbdao.beans.Atendimento;
import br.ucb.cesbdao.beans.Trabalhador;
import br.ucb.cesbdao.controller.ControladorJanelas;
import br.ucb.cesbdao.enuns.EnumControleJanela;
import br.ucb.cesbdao.enuns.EnumMensagens;
import br.ucb.cesbdao.enuns.EnumOrdenaAtendimento;
import br.ucb.cesbdao.janelas.DialogTipo;
import br.ucb.cesbdao.janelas.Janela;
import br.ucb.cesbdao.janelas.SelecionaAFI;
import br.ucb.cesbdao.model.AtendimentoModel;
import br.ucb.cesbdao.model.TipoAtendimentoDoAtendimentoModel;
import br.ucb.cesbdao.model.TipoEncaminhamentoDoAtendimentoModel;
import br.ucb.cesbdao.model.TrabalhadorModel;
import br.ucb.cesbdao.model.impl.AtendimentoModelImpl;
import br.ucb.cesbdao.model.impl.TipoAtendimentoDoAtendimentoModelImpl;
import br.ucb.cesbdao.model.impl.TipoEncaminhamentoDoAtendimentoModelImpl;
import br.ucb.cesbdao.model.impl.TrabalhadorModelImpl;
import br.ucb.cesbdao.modeloTabelas.ModeloTabelaAtendimentoApoio;
import br.ucb.cesbdao.modeloTabelas.ModeloTabelaAtendimentoGerencia;
import br.ucb.cesbdao.modeloTabelas.ModeloTabelaPacienteApoio;
import br.ucb.cesbdao.servicos.DateUtil;
import br.ucb.cesbdao.servicos.Validadores;
import br.ucb.cesbdao.visao.HoraDialog;
import br.ucb.cesbdao.visao.Visao;

public class AtendimentoUtil {
	private static int idPessoa;
	private static Boolean flag;

	public int getIdPessoa() {
		return idPessoa;
	}

	@SuppressWarnings("static-access")
	public void setIdPessoa(int idPessoa) {
		this.idPessoa = idPessoa;
	}

	public static ArrayList<Atendimento> getAtendimentoEspera(){
		ArrayList<Atendimento> atendimentos = new ArrayList<Atendimento>();
		AtendimentoModel model = new AtendimentoModelImpl();
		atendimentos = model.getEspera();
		Collections.sort(atendimentos, EnumOrdenaAtendimento.BYPRIORIDADE);
		return atendimentos;
	}

	public static ArrayList<Atendimento> getAtendimentoEmAndamento(){
		ArrayList<Atendimento> atendimentos = new ArrayList<Atendimento>();
		AtendimentoModel model = new AtendimentoModelImpl();
		atendimentos = model.getEmAndamento();
		Collections.sort(atendimentos, EnumOrdenaAtendimento.BYPRIORIDADE);
		return atendimentos;
	}

	@SuppressWarnings("rawtypes")
	public static boolean novoAtendimentoChegada(JTable tableAtendido, ModeloTabelaPacienteApoio modeloTablePaciente, JList listPreferencia) {
		if(tableAtendido.getSelectedRow() < 0){
			Visao.showMessageWarning(EnumMensagens.MSG_ALERTA_ATENDIDO_N_SELECIONADO.getMensagem(), "Aviso do sistema");
			return false;
		}
		if(listPreferencia.getSelectedValue() == null){
			Visao.showMessageWarning(EnumMensagens.MSG_ERRO_PRIORIDADE.getMensagem(), "Aviso do sistema");
			return false;
		}
		ControladorJanelas.invokeJDialog("Atendimento", EnumControleJanela.JANELA_HORA_DIALOG.getNomeJanela());
		Visao.showMessage(EnumMensagens.MSG_CONFIRMACAO_ATDM_CADASTRO_SUCESSO.getMensagem(),"Cadastro Atendimento");
		AtendimentoModel model = new AtendimentoModelImpl();
		idPessoa = modeloTablePaciente.getPessoaAt(tableAtendido.getSelectedRow()).getId();
		model.addAtendimento(getAtendimento(listPreferencia.getSelectedIndex()));
		return true;
	}
	
	@SuppressWarnings("rawtypes")
	public static boolean novoAtendimentoChegadaGerencia(JTable tableAtendido, ModeloTabelaPacienteApoio modeloTablePaciente, JList listPreferencia) {
		AtendimentoModel model = new AtendimentoModelImpl();
		if(tableAtendido.getSelectedRow() < 0){
			Visao.showMessageWarning(EnumMensagens.MSG_ALERTA_ATENDIDO_N_SELECIONADO.getMensagem(), "Aviso do sistema");
			return false;
		}

		if(listPreferencia.getSelectedValue() == null){
			Visao.showMessageWarning(EnumMensagens.MSG_ERRO_PRIORIDADE.getMensagem(), "Aviso do sistema");
			return false;
		}

		Visao.showMessage(EnumMensagens.MSG_CONFIRMACAO_ATDM_CADASTRO_SUCESSO.getMensagem(),"Cadastro Atendimento");
		idPessoa = modeloTablePaciente.getPessoaAt(tableAtendido.getSelectedRow()).getId();
		model.addAtendimento(getAtendimentoGerencia(listPreferencia.getSelectedIndex()),Janela.getDpDataAtendimento().getDate());
		return true;
	}
	public static boolean novoAtendimentoChegada() {
		ControladorJanelas.invokeJDialog("Atendimento", EnumControleJanela.JANELA_NOVO_ATENDIMENTO.getNomeJanela());
		return true;
	}
	@SuppressWarnings("rawtypes")
	public static boolean novoAtendimentoChegada(JTable tableAtendido, ModeloTabelaPacienteApoio modeloTablePaciente, JList listPreferencia,Integer integer) {
		AtendimentoModel model = new AtendimentoModelImpl();
		if(tableAtendido.getSelectedRow() < 0){
			Visao.showMessageWarning(EnumMensagens.MSG_ALERTA_ATENDIDO_N_SELECIONADO.getMensagem(), "Aviso do sistema");
			return false;
		}

		if(listPreferencia.getSelectedValue() == null){
			Visao.showMessageWarning(EnumMensagens.MSG_ERRO_PRIORIDADE.getMensagem(), "Aviso do sistema");
			return false;
		}
		ControladorJanelas.invokeJDialog("Atendimento", EnumControleJanela.JANELA_HORA_DIALOG.getNomeJanela());
		//setIdPessoa(modeloTablePaciente.getPessoaAt(tableAtendido.getSelectedRow()).getId());
		Visao.showMessage(EnumMensagens.MSG_CONFIRMACAO_ATDM_CADASTRO_SUCESSO.getMensagem(),"Cadastro Atendimento");
		idPessoa = modeloTablePaciente.getPessoaAt(tableAtendido.getSelectedRow()).getId();
		model.addAtendimento(getAtendimento(listPreferencia.getSelectedIndex(),integer));
		return true;
	}

	/**
	 * 
	 * @param preferencial
	 * @return atendimento chegada com cpf null hora de entrada e saida null
	 * @
	 */
	public static Atendimento getAtendimento(int preferencial) {
		return new Atendimento(0,
				idPessoa,
				null,
				DateUtil.getDataFormatoString(new Date()),
				DateUtil.getDiaSemanaAtual(),
				HoraDialog.getHora(),
				null,
				null,
				preferencial);
	}
	public static Atendimento getAtendimentoGerencia(int preferencial) {
		return new Atendimento(0,
				idPessoa,
				null,
				DateUtil.getDataFormatoString(Janela.getDpDataAtendimento().getDate()),
				DateUtil.getDiaSemanaAtual(Janela.getDpDataAtendimento().getDate()),
				null,
				null,
				null,
				preferencial);
	}
	public static Atendimento getAtendimento(int preferencial,Integer id){
		TrabalhadorModel model = new TrabalhadorModelImpl();
		return new Atendimento(0,
				idPessoa,
				model.consultaTrabalhador(id).getCpf(),
				DateUtil.getDataFormatoString(new Date()),
				DateUtil.getDiaSemanaAtual(),
				HoraDialog.getHora(),
				null,
				null,
				preferencial);
	}

	public static boolean registraAFI(JTable tableAtenidmento, ModeloTabelaAtendimentoApoio modeloTabelaAtendimento){
		AtendimentoModel model = new AtendimentoModelImpl();
		setFlag(false);
		ControladorJanelas.invokeJDialog("Atendimento", EnumControleJanela.JANELA_SELECIONA_AFI.getNomeJanela());
		Trabalhador afi = SelecionaAFI.getTrabalhador();
		if(afi == null)
			return false;
		model.registraEntrada(modeloTabelaAtendimento.getAtendimentoAt(tableAtenidmento.getSelectedRow()).getIdAtendimento(),afi.getCpf());
		return true;
	}
	public static boolean registraAFI(JTable tableAtenidmento, ModeloTabelaAtendimentoGerencia modeloTabelaAtendimentoGerencia){
		AtendimentoModel model = new AtendimentoModelImpl();
		setFlag(true);
		ControladorJanelas.invokeJDialog("Atendimento", EnumControleJanela.JANELA_SELECIONA_AFI.getNomeJanela());
		Trabalhador afi = SelecionaAFI.getTrabalhador();
		if(afi == null)
			return false;
		model.registraEntrada(modeloTabelaAtendimentoGerencia.getAtendimentoAt(tableAtenidmento.getSelectedRow()).getIdAtendimento(),afi.getCpf());
		return true;
	}
	public static boolean registraEntrada(JTable tableAtenidmento, ModeloTabelaAtendimentoApoio modeloTabelaAtendimento){
		AtendimentoModel model = new AtendimentoModelImpl();
		ControladorJanelas.invokeJDialog("Atendimento", EnumControleJanela.JANELA_HORA_DIALOG.getNomeJanela());
		model.registraHorarioEntrada(modeloTabelaAtendimento.getAtendimentoAt(tableAtenidmento.getSelectedRow()).getIdAtendimento());
		return true;
	}
	public static boolean registraEntrada(JTable tableAtenidmento, ModeloTabelaAtendimentoGerencia modeloTabelaAtendimentoGerencia){
		AtendimentoModel model = new AtendimentoModelImpl();
		ControladorJanelas.invokeJDialog("Atendimento", EnumControleJanela.JANELA_HORA_DIALOG.getNomeJanela());
		model.registraHorarioEntrada(modeloTabelaAtendimentoGerencia.getAtendimentoAt(tableAtenidmento.getSelectedRow()).getIdAtendimento());
		return true;
	}
	public static boolean registraMarcacao(JTable tableAtenidmento, ModeloTabelaAtendimentoApoio modeloTabelaAtendimento){
		AtendimentoModel model = new AtendimentoModelImpl();
		ControladorJanelas.invokeJDialog("Atendimento", EnumControleJanela.JANELA_HORA_DIALOG.getNomeJanela());
		model.registraHorarioMarcacao(modeloTabelaAtendimento.getAtendimentoAt(tableAtenidmento.getSelectedRow()).getIdAtendimento());
		return true;
	}
	public static boolean registraMarcacao(JTable tableAtenidmento, ModeloTabelaAtendimentoGerencia modeloTabelaAtendimentoGerencia){
		AtendimentoModel model = new AtendimentoModelImpl();
		ControladorJanelas.invokeJDialog("Atendimento", EnumControleJanela.JANELA_HORA_DIALOG.getNomeJanela());
		model.registraHorarioMarcacao(modeloTabelaAtendimentoGerencia.getAtendimentoAt(tableAtenidmento.getSelectedRow()).getIdAtendimento());
		return true;
	}
	public static boolean registraSaida(JTable tableAtenidmento, ModeloTabelaAtendimentoApoio modeloTabelaAtendimento){
		AtendimentoModel model = new AtendimentoModelImpl();
		ControladorJanelas.invokeJDialog("Atendimento", EnumControleJanela.JANELA_HORA_DIALOG.getNomeJanela());
		model.registraSaida(modeloTabelaAtendimento.getAtendimentoAt(tableAtenidmento.getSelectedRow()).getIdAtendimento());
		return true;
	}
	public static boolean registraSaida(JTable tableAtenidmento, ModeloTabelaAtendimentoGerencia modeloTabelaAtendimentoGerencia){
		AtendimentoModel model = new AtendimentoModelImpl();
		ControladorJanelas.invokeJDialog("Atendimento", EnumControleJanela.JANELA_HORA_DIALOG.getNomeJanela());
		model.registraSaida(modeloTabelaAtendimentoGerencia.getAtendimentoAt(tableAtenidmento.getSelectedRow()).getIdAtendimento());
		return true;
	}
	public static boolean registraDesistencia(JTable tableAtenidmento, ModeloTabelaAtendimentoApoio modeloTabelaAtendimento) {
		AtendimentoModel model = new AtendimentoModelImpl();
		if(tableAtenidmento.getSelectedRow() == -1 ){
			Visao.showMessageWarning(EnumMensagens.MSG_ALERTA_ATENDIMENTO_N_SELECIONADO.getMensagem(), "Aviso do sistema");
			return false;
		}
		if(Validadores.veficicaDesistencia(modeloTabelaAtendimento.getAtendimentoAt(tableAtenidmento.getSelectedRow()).getIdAtendimento())){
			Visao.showMessageWarning(EnumMensagens.MSG_ALERTA_DESISTENCIA.getMensagem(), "Aviso do sistema");
			return false;
		}
		ControladorJanelas.invokeJDialog("Atendimento", EnumControleJanela.JANELA_HORA_DIALOG.getNomeJanela());
		model.registraSaida(modeloTabelaAtendimento.getAtendimentoAt(tableAtenidmento.getSelectedRow()).getIdAtendimento());
		return true;
	}

	public static void dellAtendimeto(int idAtendimento){
		AtendimentoModel model = new AtendimentoModelImpl();
		TipoAtendimentoDoAtendimentoModel modelTp = new TipoAtendimentoDoAtendimentoModelImpl();
		TipoEncaminhamentoDoAtendimentoModel modelEnc = new TipoEncaminhamentoDoAtendimentoModelImpl();
		if(Visao.showYesNo(EnumMensagens.MSG_Q_CONFIRMACAO_DELETAR_ATENDIMENTO.getMensagem(),"Comfima")){
			modelTp.DellByIdAtendimento(idAtendimento);
			modelEnc.DellByIdAtendimento(idAtendimento);
			model.delAtendimento(idAtendimento);
		}
	}

	public static void registraTipo(JTable jtAtendimento, ModeloTabelaAtendimentoGerencia modeloTabelaAtendimentoGerencia){
		AtendimentoModel model = new AtendimentoModelImpl();
		ControladorJanelas.invokeJDialog("Atendimento", EnumControleJanela.DIALOG_TIPO.getNomeJanela());
		model.upTipo(modeloTabelaAtendimentoGerencia.getAtendimentoAt(jtAtendimento.getSelectedRow()).getIdAtendimento(),DialogTipo.getTipo());
	}

	public static Boolean getFlag() {
		return flag;
	}

	public static void setFlag(Boolean flag) {
		AtendimentoUtil.flag = flag;
	}
	
}
